package com.guaoran.interview.in23.thread;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author : 孤傲然
 * @description : 两个线程，一个数字1-10，一个字符a-e ,打印出来12a34b56c78d910e
 * @date :2020/7/18 23:03
 */
public class ThreadDemo {

    public static volatile boolean flag = false;

    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        Condition numCondition = lock.newCondition();
        Condition strCondition = lock.newCondition();
        new ThreadStr(lock,numCondition,strCondition).start();
        new ThreadNum(lock,numCondition,strCondition).start();
    }

    static class ThreadNum extends Thread {
        private Lock lock;
        private Condition numCondition;
        private Condition strCondition;

        public ThreadNum(Lock lock, Condition numCondition, Condition strCondition) {
            this.lock = lock;
            this.numCondition = numCondition;
            this.strCondition = strCondition;
        }

        @Override
        public void run() {
            lock.lock();
            flag = true;
            try {
                for (int i = 1; i < 11; i++) {
                    System.out.print(i);
                    if(i%2==0){
                        strCondition.signal();
                        numCondition.await();
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    }
    static class ThreadStr extends Thread {
        private Lock lock;
        private Condition numCondition;
        private Condition strCondition;

        public ThreadStr(Lock lock, Condition numCondition, Condition strCondition) {
            this.lock = lock;
            this.numCondition = numCondition;
            this.strCondition = strCondition;
        }

        @Override
        public void run() {
            while (!flag) {
            }
            lock.lock();
            try {
                for (int i = 97; i < 102; i++) {
                    System.out.print((char) i);
                    numCondition.signal();
                    // 如果是e ,说明执行到最后了， 不在阻塞了
                    if(i!=101) {
                        strCondition.await();
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }

}
